/**
 * 
 */
package ar.edu.utn.frgp.banco.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.ReportesDao;
import ar.edu.utn.frgp.banco.domain.Movimientos;
import ar.edu.utn.frgp.banco.domain.PagoServicios;
import ar.edu.utn.frgp.banco.domain.Transferencias;
import ar.edu.utn.frgp.banco.domain.enums.OrigenMovimiento;
import ar.edu.utn.frgp.banco.domain.enums.TipoMovimiento;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.utils.Constantes;
import ar.edu.utn.frgp.banco.utils.ConverterUtils;

/**
 * @author PUSDERKIS
 *
 */
public class ReportesDaoImpl extends GenericDaoImpl implements ReportesDao {

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.dao.ReportesDao#depositosYExtraccionesEntreFechas(java.lang.Long, java.util.Date, java.util.Date)
	 */
	@Override
	public List<Movimientos> depositosYExtraccionesEntreFechas(Long idCuenta,
			Date fechaIni, Date fechaFin) throws DataAccessException {
		List<Movimientos> mov = new ArrayList<Movimientos>();
		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		
		StringBuffer query = new StringBuffer();
		
		query.append("SELECT ")
		.append("ID_MOV,")
		.append("NRO_CUENTA,")
		.append("FECHA,")
		.append("TIPO_MOV,")
		.append("ORIGEN,")
		.append("SALDO_ACTUAL,")
		.append("MONTO_MOV ")
		.append("FROM MOVIMIENTOS WHERE FECHA <= TO_DATE('").append(ConverterUtils.dateToString(fechaFin)).append("','dd/MM/yyyy') AND ")
		.append("FECHA >= TO_DATE('").append(ConverterUtils.dateToString(fechaIni)).append("','dd/MM/yyyy') AND NRO_CUENTA = ?");
		
		try{
			con = getConection();
			
			st = con.prepareStatement(query.toString());
			st.setLong(1, idCuenta);
			
			rs = st.executeQuery();
			Movimientos m;
			while (rs.next()){
				m = new Movimientos();
				
				m.setId(rs.getLong(1));
				
				m.setNroCuenta(rs.getLong(2));
				
				java.sql.Date fecha = rs.getDate(3);
				if (fecha != null)
					m.setFecha(fecha);
				
				TipoMovimiento tm = TipoMovimiento.obtenerTipoMovimiento(rs.getString(4));
				m.setTipoMov(tm);
				m.setOrigen(OrigenMovimiento.obtenerOrigenMovimiento(rs.getString(5)));
				
				m.setSaldoActual(rs.getBigDecimal(6));
				m.setMontoMovimiento(rs.getBigDecimal(7));
				mov.add(m);
			}
			
			
		}catch (SQLException sql){
			throw new DataAccessException(Constantes.EXCEPCION_BD_GENERICA);
		} finally {
			closeResultSet(rs);
			closeStatement(st);
			closeConnection();
		}
		
		return mov;
	}

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.dao.ReportesDao#plazosFijosPorCliente(java.lang.String)
	 */
	



	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.dao.ReportesDao#historialPagoServicios(java.lang.String)
	 */
	@Override
	public List<PagoServicios> historialPagoServicios(String dni) throws DataAccessException {
		// TODO Auto-generated method stub
		return null;
	}

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.dao.ReportesDao#historialTransferenciasRealizadas(java.lang.Long)
	 */
	@Override
	public List<Transferencias> historialTransferenciasRealizadas(Long cuenta) throws DataAccessException {			
			List<Transferencias> trans = new ArrayList<Transferencias>();
			
			Connection con = null;
			PreparedStatement st = null;
			ResultSet rs = null;
			
			StringBuffer query = new StringBuffer();
			
			query.append("SELECT ")
			.append("ID,")
			.append("NRO_CTA_origen,")
			.append("NRO_CTA_DESTINO,")
			.append("MONTO,")
			.append("FECHA")
			.append(" FROM Transferencias WHERE NRO_CTA_origen = ? OR NRO_CTA_DESTINO = ?");
			
			try{
				con = getConection();
				
				st = con.prepareStatement(query.toString());
				st.setLong(1, cuenta);
				st.setLong(2, cuenta);
				
				rs = st.executeQuery();
				Transferencias tr;
				while (rs.next()){
					tr = new Transferencias();
					
					tr.setId(rs.getLong(1));
					tr.setNroCuentaDestino(rs.getLong(2));
					tr.setNroCuentaOrigen(rs.getLong(3));
					tr.setMonto(rs.getBigDecimal(4));
					tr.setFecha(rs.getDate(5));
					
					trans.add(tr);
				}
				
			}catch (SQLException sql){
				throw new DataAccessException(Constantes.EXCEPCION_BD_GENERICA);
			} finally {
				closeResultSet(rs);
				closeStatement(st);
				closeConnection();
			}
			
			return trans;
	}

}
